import java.util.*;

class Solution01 {
    // 定义一个哈希表 用来标记
    Set<String> hashSet = new HashSet<>();

    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        // 将单词数组转换为哈希表，因为 contains() 要逐个查找进行判断
        Set<String> hashWordList = new HashSet<>();
        for (String str : wordList) {
            hashWordList.add(str);
        }
        // 处理边界条件
        if (!hashWordList.contains(endWord)) {
            return 0;
        }
        // 创建一个队列
        Queue<String> q = new LinkedList<>();
        // 入队
        q.add(beginWord);
        // 进行标记
        hashSet.add(beginWord);
        // 定一个变量记录结果
        int ret = 0;
        // 循环判断
        while (!q.isEmpty()) {
            // 计算队列长度
            int size = q.size();
            ret++;
            for (int j = 0; j < size; j++) {
                // 弹出队头元素
                String s = q.poll();
                for (int i = 0; i < s.length(); i++) {
                    // 将字符串转换为字符数组
                    char[] tmp = s.toCharArray();
                    for (char ch = 'a'; ch <= 'z'; ch++) {
                        tmp[i] = ch;
                        // 转换为字符串
                        String string = new String(tmp);
                        // 进行判断
                        if (hashWordList.contains(string) && !hashSet.contains(string)) {
                            if (endWord.equals(string)) {
                                return ret + 1;
                            }
                            // 添加到队列
                            q.add(string);
                            // 进行标记
                            hashSet.add(string);
                        }
                    }
                }
            }
        }
        return 0;
    }
}